﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Repositorios;
using Onshi.POS.Articulos.Vistas;
using Onshi.POS.Modelo.Enumeradores;
using Onshi.POS.Modelo.Objectos;

namespace Onshi.POS.Articulos
{
    public class ArticulosSeleccionarPresentador
    {
        #region Constructores

        public ArticulosSeleccionarPresentador(IArticulosSeleccionar vista)
        {
            this.vista = vista;
        }

        #endregion

        #region Atributos

        private IArticulosSeleccionar vista;

        #endregion

        #region Propiedades

        private RepositorioArticulos RepositorioArticulos
        {
            get { return new RepositorioArticulos(); }
        }

        private RepositorioUbicaciones RepositorioUbicaciones
        {
            get { return new RepositorioUbicaciones(); }
        }

        #endregion

        #region Metodos

        public void Seleccionar()
        {
            var articulo = RepositorioArticulos.DevolverPorId(vista.IdArticulo);
            if (articulo == null)
                throw new Exception("El artículo no existe");
            vista.Nombre = articulo.Nombre;
            vista.Codigo = articulo.Codigo;
            switch ((EnumTiposArticulos)articulo.Tipo.Id)
            {
                case EnumTiposArticulos.Estandar:
                    switch (vista.TipoSeleccion)
                    {
                        case EnumArticulosTiposSelecciones.Ubicaciones:
                            break;
                        case EnumArticulosTiposSelecciones.Variantes:
                            if (articulo.Variantes.Count > 0)
                            {
                                var listado = ArticuloTipoSeleccion.GenerarListado(articulo.Variantes);
                                vista.ListadoSeleccion = listado;
                                vista.TablaSeleccion = ArticuloTipoSeleccion.GenerarTabla(listado, false, false);
                            }
                            break;
                        case EnumArticulosTiposSelecciones.VariantesExistencias:
                            if (articulo.Variantes.Count > 0)
                            {
                                var listado = ArticuloTipoSeleccion.GenerarListado(articulo.Variantes, articulo.Existencias);
                                vista.ListadoSeleccion = listado;
                                vista.TablaSeleccion = ArticuloTipoSeleccion.GenerarTabla(listado, true, false);
                            }
                            break;
                        case EnumArticulosTiposSelecciones.VariantesUbicaciones:
                            if (articulo.Variantes.Count > 0)
                            {
                                var listado = ArticuloTipoSeleccion.GenerarListado(articulo.Variantes, RepositorioUbicaciones.DevolverTodos());
                                vista.ListadoSeleccion = listado;
                                vista.TablaSeleccion = ArticuloTipoSeleccion.GenerarTabla(listado, false, true);
                            }
                            break;
                        case EnumArticulosTiposSelecciones.VariantesUbicacionesExistencias:
                            if (articulo.Variantes.Count > 0)
                            {
                                var listado = ArticuloTipoSeleccion.GenerarListado(articulo.Variantes, RepositorioUbicaciones.DevolverTodos());
                                vista.ListadoSeleccion = listado;
                                vista.TablaSeleccion = ArticuloTipoSeleccion.GenerarTabla(listado, true, true);
                            }
                            break;
                    }
                    break;



                case EnumTiposArticulos.Compuesto:
                    List<Tuple<Int32, List<ArticuloExistencia>>> aa;


                    foreach (var articuloCompuesto in articulo.ArticulosCompuestos)
                    {
                        if (articuloCompuesto.Entidad.Tipo.Id == (Byte)EnumTiposArticulos.Estandar)
                        {
                            switch (vista.TipoSeleccion)
                            {
                                case EnumArticulosTiposSelecciones.Ubicaciones:
                                    break;
                                case EnumArticulosTiposSelecciones.Variantes:
                                    if (articuloCompuesto.Entidad.Variantes.Count > 0)
                                    {
                                        var listado = ArticuloTipoSeleccion.GenerarListado(articuloCompuesto.Entidad.Variantes);
                                        vista.ListadoSeleccion = listado;
                                        vista.TablaSeleccion = ArticuloTipoSeleccion.GenerarTabla(listado, false, false);
                                    }
                                    break;
                                case EnumArticulosTiposSelecciones.VariantesExistencias:
                                    if (articuloCompuesto.Entidad.Variantes.Count > 0)
                                    {
                                        var listado = ArticuloTipoSeleccion.GenerarListado(articuloCompuesto.Entidad.Variantes, articuloCompuesto.Entidad.Existencias);
                                        vista.ListadoSeleccion = listado;
                                        vista.TablaSeleccion = ArticuloTipoSeleccion.GenerarTabla(listado, true, false);
                                    }
                                    break;
                                case EnumArticulosTiposSelecciones.VariantesUbicaciones:
                                    if (articuloCompuesto.Entidad.Variantes.Count > 0)
                                    {
                                        var listado = ArticuloTipoSeleccion.GenerarListado(articuloCompuesto.Entidad.Variantes, RepositorioUbicaciones.DevolverTodos());
                                        vista.ListadoSeleccion = listado;
                                        vista.TablaSeleccion = ArticuloTipoSeleccion.GenerarTabla(listado, false, true);
                                    }
                                    break;
                                case EnumArticulosTiposSelecciones.VariantesUbicacionesExistencias:
                                    if (articuloCompuesto.Entidad.Variantes.Count > 0)
                                    {
                                        var listado = ArticuloTipoSeleccion.GenerarListado(articuloCompuesto.Entidad.Variantes, RepositorioUbicaciones.DevolverTodos());
                                        vista.ListadoSeleccion = listado;
                                        vista.TablaSeleccion = ArticuloTipoSeleccion.GenerarTabla(listado, true, true);
                                    }
                                    break;
                            }
                        }
                    }
                    break;
            }
        }

        public void SeleccionarPorCodigo()
        {
            var articulo = RepositorioArticulos.DevolverPorCodigo(vista.Codigo);
            if (articulo == null)
                throw new Exception("El artículo no existe");
            vista.IdArticulo = articulo.Id;
            vista.Nombre = articulo.Nombre;
            vista.Codigo = articulo.Codigo;
        }

        public void SeleccionarConDetalles()
        {
            var articulo = RepositorioArticulos.DevolverPorId(vista.IdArticulo);
            if (articulo == null)
                throw new Exception("El artículo no existe");
            var detalle = vista.ListadoSeleccion.SingleOrDefault(x => x.Id == vista.IdDetalle);
            if (detalle == null)
                throw new Exception("El detalle no existe");

            var idVariantesDetalles = new List<Int32>();
            var nombre = articulo.Nombre;
            foreach (var item in detalle.VariantesDetalles)
            {
                nombre += String.Format(" {0}:{1}", item.Variante.Nombre, item.Valor);
                idVariantesDetalles.Add(item.Id);
            }
            vista.IdVariantesDetalles = idVariantesDetalles;
            vista.Nombre = nombre;
            vista.Codigo = articulo.Codigo;
        }

        #endregion
    }
}
